based on v1.6.3
部署 MinIO 服务 以 Velero 提供的 MinIO 服务 进行 DEMO 验证,为了便于操作将 ClusterIP 改为 NodePort
部署结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # kubectl get all -n velero -l component=minio NAME READY STATUS RESTARTS AGE pod/minio-54b5867494-28dvt 1/1 Running 0 80s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/minio NodePort 10.96.107.103 <none> 9000:30188/TCP 80s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/minio 1/1 1 1 80s NAME DESIRED CURRENT READY AGE replicaset.apps/minio-54b5867494 1 1 1 80s NAME COMPLETIONS DURATION AGE job.batch/minio-setup 1/1 6s 80s
账号密码通过 MinIO 服务中 MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY 环境变量设置,登陆后效果如下:
其中,minio-setup 的 Job 已经创建出了一个名为 velero 的 Bucket
准备认证文件 1 2 3 4 5 $ cat > credentials-velero <<EOF [default] aws_access_key_id = minio aws_secret_access_key = minio123 EOF
部署 Velero 服务 命令行安装 1 2 3 4 5 6 7 $ velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.0.0 \ --bucket velero \ --secret-file ./credentials-velero \ --use-volume-snapshots=false \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000
参数说明
provider
指定 plugin 的 provider,默认格式为 x/y,如果省略 x 部分,则默认为 velero.io,需要与 plugin 注册的保持一致
plugins
指定 plugin 使用的镜像
bucket
为对象存储中的存储桶概念
secret-file
用于与后端存储服务认证的信息,如果存储服务不需要凭证,则将 secret-file 替换成 no-secret
use-volume-snapshots
是否自动创建一个 SnapshotLocation,如果不打算通过创建卷快照,则设置为 false,默认为 true
backup-location-config
为默认的 BackupStorageLocation 信息,可以在部署 Velero 后增量配置
部署结果 1 2 3 4 5 6 7 8 9 $ kubectl get all -n velero -l component=velero NAME READY STATUS RESTARTS AGE pod/velero-64b8fddd66-fqdvt 1/1 Running 0 32s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/velero 1/1 1 1 32s NAME DESIRED CURRENT READY AGE replicaset.apps/velero-64b8fddd66 1 1 1 32s
1 2 3 4 5 6 7 8 9 10 11 12 13 $ kubectl get crd -l component=velero NAME CREATED AT backups.velero.io 2022-11-07T08:54:56Z backupstoragelocations.velero.io 2022-11-07T08:54:56Z deletebackuprequests.velero.io 2022-11-07T08:54:56Z downloadrequests.velero.io 2022-11-07T08:54:56Z podvolumebackups.velero.io 2022-11-07T08:54:56Z podvolumerestores.velero.io 2022-11-07T08:54:56Z resticrepositories.velero.io 2022-11-07T08:54:56Z restores.velero.io 2022-11-07T08:54:56Z schedules.velero.io 2022-11-07T08:54:56Z serverstatusrequests.velero.io 2022-11-07T08:54:56Z volumesnapshotlocations.velero.io 2022-11-07T08:54:56Z
1 2 3 $ velero backup-location get NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT default aws velero Available 2022-11-07 16:55:06 +0800 CST ReadWrite true
流程验证 以 Velero 提供的基础 nginx 服务 进行 DEMO 验证
1 2 3 4 5 6 7 8 9 10 11 12 13 $ kubectl get all -n nginx-example NAME READY STATUS RESTARTS AGE pod/nginx-deployment-5bcc46cc5-fmnf4 1/1 Running 0 106s pod/nginx-deployment-5bcc46cc5-njlhk 1/1 Running 0 106s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-nginx LoadBalancer 10.96.158.105 <pending> 80:30449/TCP 106s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 2 2 106s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-5bcc46cc5 2 2 2 106s
操作验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # 创建备份任务 $ velero backup create default $ velero backup get NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR default Completed 0 0 2022-11-07 17:03:46 +0800 CST 29d default <none> # 模拟故障 $ kubectl delete ns nginx-example # 创建恢复任务 $ velero restore create default --from-backup default $ velero restore get NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR default-20221107170719 default Completed 2022-11-07 17:07:19 +0800 CST 2022-11-07 17:08:19 +0800 CST 0 119 2022-11-07 17:07:19 +0800 CST <none> # 恢复结果查看 $ kubectl get all -n nginx-example NAME READY STATUS RESTARTS AGE pod/nginx-deployment-5bcc46cc5-fmnf4 1/1 Running 0 90s pod/nginx-deployment-5bcc46cc5-njlhk 1/1 Running 0 90s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-nginx LoadBalancer 10.96.27.235 <pending> 80:31162/TCP 59s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 2 2 73s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-5bcc46cc5 2 2 2 89s
可以初步看到以下几个特点:
Deployment 和 Pod 在恢复之后,UUID 并未变化
Service 和 Pod 的 IP 与端口在恢复之后,被重新分配
MinIO 中相关的数据
备份与恢复数据结构 Backup 数据结构
name
content
velero-backup.json
Backup 对象的 Json 格式
default-volumesnapshots.json.gz
Velero 中 VolumeSnapshots 对象的 Json 格式
default-podvolumebackups.json.gz
PodvolumeBackups 对象的 Json 格式
default-csi-volumesnapshots.json.gz
CSI 中 VolumeSnapshots 对象的 Json 格式
default-csi-volumesnapshotcontents.json.gz
CSI 中 VolumeSnapshotsContent 对象的 Json 格式
default-logs.gz
备份任务日志
default.tar.gz
备份的全部数据,包括两子内容:metadata 和 resources,metadata 文件夹中包含一个 verison 文件,内容为 1.1.0;resources 文件夹中包含各类资源全名的子文件夹,例如 alertmanagers.monitoring.coreos.com,里面包含以 namespaces 或 cluster 区分的资源对象的 Json 格式
default-resource-list.json.gz
备份的资源清单,格式为 {“资源全名”: [各资源信息,格式为 ns/name]}
Restore 数据结构
name
content
restore-default-20221107170719-results.gz
恢复的详情信息,格式为 {“errors”:{},”warnings”:{“cluster”: [“各资源恢复异常原因”], “各 namespace”: [“各资源恢复异常原因”]}}
restore-default-20221107170719-logs.gz
恢复任务日志